CTF30 來到尾聲。
今年決定從領域非常廣的 網路安全概述,跳到非常偏實作的 CTF30。原意是希望藉著這一整個月都持續看 CTF Writeup 來累積更多的 CTF 實戰經驗,並學習如何運用各種解題技巧和工具來在駭客比賽中取得更好的結果。
多年來一直在業餘狀況下做研究,偶而打打 CTF 和 PT,但感覺經驗累積還需要更快才行。
今年參賽有組了隊伍 Infosec Horadrim,但可惜的是有隊友因為發文界面 UI 的設計,誤以為文章已發出,但其實只是存成草稿,最後導致團隊挑戰失敗。
這個 UI 導致的問題是除了我的參賽隊友遇到以外,亦有從朋友間聽聞,有其他參賽者也發生一樣的狀況。由於我用 Email 和主辦反映後仍未得到改善,故只好在文章上公開講了。希望未來的參賽者,能夠互相提醒,避免憾事再度發生。
值得一提的是,今年參賽 22 人的 好想工作室第二屆鐵人賽 亦有用上去年我做的 催文機 (GitHub),時時提醒發文,今年順利完賽。
故若主辦方未來還是不會修改這個 UI,我就會推薦團隊參賽的大家一起來使用這個 Bot。甚至可以做成某種平臺,每天幫你提醒。
由於這個程式的中,函式的位置不是固定的,所以我們做 exploit 時,要以相對位置來計算。
(gdb) info functions
All defined functions:
Non-debugging symbols:
0x0000000000001000 _init
0x0000000000001030 putchar@plt
0x0000000000001040 __isoc99_fscanf@plt
0x0000000000001050 puts@plt
0x0000000000001060 fread@plt
0x0000000000001070 __stack_chk_fail@plt
0x0000000000001080 system@plt
0x0000000000001090 fgetc@plt
0x00000000000010a0 setvbuf@plt
0x00000000000010b0 _start
0x00000000000010e0 deregister_tm_clones
0x0000000000001110 register_tm_clones
0x0000000000001150 __do_global_dtors_aux
0x00000000000011a0 frame_dummy
0x00000000000011a9 givemeshellpls
0x00000000000011bc dologic
0x0000000000001279 main
0x00000000000013d0 __libc_csu_init
0x0000000000001440 __libc_csu_fini
0x0000000000001448 _fini
所以這裡會有一個有趣的功能 giveshellpls
,注意它的位置只和 dologic
只差 1 byte。
0x0000000000001293 <+26>: lea rax,[rip+0xffffffffffffff22] # 0x11bc <dologic>
0x000000000000129a <+33>: mov QWORD PTR [rbp-0x20],rax
由於我這次連 r2 都沒用,所以只能用 gdb 來拆程式。
程式的一開始,大概有一句 var = dologic;
。所以我們可以複寫這個變數,然後跳到 givemeshellpls
。
我們的 var
在 rbp-0x20
,然後我們可以輸入的字串位置在 rbp-0x420
。
這代表說,只要覆蓋 0x400 byte 後,就可以改掉 var
的最低 bit,然後拿下 flag。
https://www.pwndiary.com/write-ups/p-w-n-ctf-2018-important-service-write-up-pwn259/